//
// Created by lyh on 18-11-4.
//

#ifndef BANK_SERVICE_WORK_DEAL_H
#define BANK_SERVICE_WORK_DEAL_H


#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>

//创建了一个类
class work_deal {
public:
    work_deal();//类的够造函数，与类名相同，没有返回值类型
private:
    void solve_task();//模拟银行柜台处理业务
    bool get_wait_nmuber();//模拟叫号机取号
private:
    std::thread deal_thread_;//创建一个线程变量，需要初始化，初始化一般放在类的构造函数中，即类一旦被创建的同时，线程也创建并开始运行了
    std::thread wait_call_;//创建一个线程变量，需要初始化，初始化一般放在类的构造函数中，即类一旦被创建的同时，线程也创建并开始运行了
    std::deque<int> wait_queue;//调用STL库中的队列容器
    int number = 0;//模拟叫号机取号按钮，0代表“取号”
    int wait_numberth =1;//排队序列号，从1开始
    std::mutex mtx;//线程锁，用了这把锁加锁的线程必须获取了这把锁才能解除阻塞状态并继续运行，这是为了防止多个线程同时对某一个对象产生操作是容易产生错误的问题，用了锁，相当于给了一个先后顺序，大家排队去处理这个公共对象，但是不要同时处理
    std::condition_variable cv;//条件变量，用来唤醒其它线程的，它具有阻塞功能，所谓阻塞可以理解成一个while(1)的死循环，一旦被唤醒，死循环就可以结束
};


#endif //BANK_SERVICE_WORK_DEAL_H
